package com.um.springboot.starter.orm.dao;

import com.um.springboot.starter.utils.ClassUtils;
import com.um.springboot.starter.utils.DateUtil;
import com.um.springboot.starter.utils.JSONUtil;
import com.um.springboot.starter.utils.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.RowMapper;

import java.beans.BeanInfo;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author 邓南辉
 * 日期 2021/4/10
 * 版权所有 广州优匠科技有限公司
 */
@Slf4j
public class DefaultRowMapper<M> implements RowMapper<M> {

    /** 转换的目标对象 */
    private Class<M> clazz;
    /** 名称处理器 */
    private NameHandler nameHandler;


    public DefaultRowMapper(Class<M> clazz, NameHandler nameHandler) {
        this.clazz = clazz;
        this.nameHandler = nameHandler;
    }


    @Override
    public M mapRow(ResultSet resultSet, int i) throws SQLException {
        M entity = ClassUtils.newInstance(this.clazz);
        BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(this.clazz);

        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

        for (PropertyDescriptor pd : pds) {
            String column = nameHandler.getColumnName(pd.getName());
            Method writeMethod = pd.getWriteMethod();
            if(null == writeMethod){
                continue;
            }
            if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
                writeMethod.setAccessible(true);
            }
            try {
                Object value = resultSet.getObject(column);

                if(pd.getPropertyType().getSimpleName().toLowerCase().equals("date")){
                    if(value != null && !value.toString().equals(""))
                        writeMethod.invoke(entity, DateUtil.to_date(value+""));
                }else if(pd.getPropertyType().getSimpleName().toLowerCase().equals("integer")){
                    writeMethod.invoke(entity, StringUtil.toInt(value));
                }else if(pd.getPropertyType().getSimpleName().toLowerCase().equals("float")){
                    writeMethod.invoke(entity, StringUtil.toFloat(value));
                }else if(pd.getPropertyType().getSimpleName().toLowerCase().equals("double")){
                    writeMethod.invoke(entity,StringUtil.toDouble(value));
                }else if(pd.getPropertyType().getSimpleName().toLowerCase().equals("list")){
                    writeMethod.invoke(entity,JSONUtil.parseJSONToList(StringUtil.getTrim(value,"[]")));
                }else{
                    writeMethod.invoke(entity, value);
                }
            } catch (SQLException e) {
                // 忽略日志输出
                // log.warn("[{}]字段数据不存在", column);
            } catch (IllegalArgumentException e) {
                // 忽略日志输出
                // log.warn("[{}]字段数据类型不匹配", column);
            } catch (Exception e) {
                log.error("", e);
            }
        }

        return entity;
    }
}
